import { _decorator, Component } from "cc";
import { StateBase } from "./StateBase";

export abstract class StateMachineBase<T> extends Component {
  // 状态字典
  protected states: Map<T, StateBase<T>> = new Map();
  // 当前状态
  protected currentState: StateBase<T> | null = null;
  // 当前状态类型
  protected currentStateType: T | null = null;

  /**
   * 注册状态
   * @param stateType 状态类型
   * @param state 状态实例
   */
  protected registerState(stateType: T, state: StateBase<T>): void {
    if (!this.states.has(stateType)) {
      this.states.set(stateType, state);
    }
  }

  /**
   * 切换状态
   * @param newStateType 新状态类型
   * @param args 传递给新状态的参数
   */
  protected changeState(newStateType: T, ...args: any[]): void {
    // 如果新状态与当前状态相同，则不进行切换
    if (newStateType === this.currentStateType) {
      return;
    }
    // 获取新状态
    const newState = this.states.get(newStateType);
    if (!newState) {
      console.error(`State ${newStateType} not found`);
      return;
    }

    // 执行进入前的预处理逻辑
    newState.beforeEnter(...args);

    // 退出当前状态
    if (this.currentState) {
      this.currentState.exit();
    }

    // 更新当前状态
    this.currentState = newState;
    this.currentStateType = newStateType;

    // 进入新状态
    this.currentState.enter(...args);
  }

  /**
   * 获取当前状态类型
   */
  public getCurrentStateType(): T | null {
    return this.currentStateType;
  }

  /**
   * 获取当前状态
   */
  public getCurrentState(): StateBase<T> | null {
    return this.currentState;
  }

  /**
   * 更新状态
   * @param dt 时间增量
   */
  protected update(dt: number): void {
    if (this.currentState) {
      this.currentState.update(dt);
    }
  }
}
